对于 JavaScript 程序,存在相同 Origin 策略的限制。 Origin 中文意为源、起点,因此也被称为 " 同源策略 " 限制。
同源策略阻止从一个 Origin 加载的文档或者脚本访问从另一个 Origin 加载的文档的属性(即 DOM )。如果协议、端口、主机相同,那么就认为两个文档具有相同的 Origin 。
一个资源的 Origin 和一个资源的有效脚本 Origin 都是 opaque 类型的标识符或者是一个元组。元组由协议、主机地址、端口以及额外的数据构成。额外的数据可能包含加密用的证书(如果使用加密连接),如果证书改变了,那么 origin 也就改变了。
对于相同 Origin 策略的限制,有一个例外,即脚本可以设置 document.domain 属性值为当前主域的后缀,这意味着删除了子域。通过删除子域,可以改变有效脚本 Origin 以允许相同主域上其它子域上的网页彼此访问。
不同子域也就是不同主机,这就意味着可以允许同一个域上不同主机上的网页可以互相访问其 DOM 。例如存在文档 http://store.lmssee.com/dir/other.html
,执行如下的设置: document.domain = "lmssee.com";
那么就会使用 http://lmssee.com/dir/page.html
进行相同 Origin 策略检测。
但是,不能设置为:
document.domain = 'other.lmssee.com';
属性 document.domain 也可以返回当前主域用于安全检测:
document.domain[=domain]
当使用共享宿主时,不要使用 document.domain 属性,如果一个不受信任的第三方也能在同一个 IP 地址但不同端口上放置 HTTP 服务器,那么相同 Origin 保护规则将会失败,因为在使用 document.domain 对比 Origin 时,端口将被忽略。